﻿<!doctype html>
<html lang="en">
	<head>
		<title>JavaScript Patterns</title>
		<meta charset="utf-8">
	</head>
	<body>
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
		<script>
		/*!
		 * jQuery prototypal inheritance plugin boilerplate
		 * Author: Alex Sexton, Scott Gonzalez
		 * Further changes: @addyosmani
		 * Licensed under the MIT license
		 */

		// myObject - an object representing a concept that you want
		// to model (e.g. a car)
		var myObject = {
		  init: function( options, elem ) {
		    // Mix in the passed-in options with the default options
		    this.options = $.extend( {}, this.options, options );

		    // Save the element reference, both as a jQuery
		    // reference and a normal reference
		    this.elem  = elem;
		    this.$elem = $(elem);

		    // Build the DOM's initial structure
		    this._build();

		    // return this so that we can chain and use the bridge with less code.
		    return this;
		  },
		  options: {
		    name: "No name"
		  },
		  _build: function(){
		    //this.$elem.html('<h1>'+this.options.name+'</h1>');
		  },
		  myMethod: function( msg ){
		    // You have direct access to the associated and cached
		    // jQuery element
		    // this.$elem.append('<p>'+msg+'</p>');
		  }
		};

		// Object.create support test, and fallback for browsers without it
		if ( typeof Object.create !== 'function' ) {
		    Object.create = function (o) {
		        function F() {}
		        F.prototype = o;
		        return new F();
		    };
		}

		// Create a plugin based on a defined object
		$.plugin = function( name, object ) {
		  $.fn[name] = function( options ) {
		    return this.each(function() {
		      if ( ! $.data( this, name ) ) {
		        $.data( this, name, Object.create(object).init(
		        options, this ) );
		      }
		    });
		  };
		};

		// Usage:
		// With myObject, we could now essentially do this:
		// $.plugin('myobj', myObject);

		// and at this point we could do the following
		// $('#elem').myobj({name: "John"});
		// var inst = $('#elem').data('myobj');
		// inst.myMethod('I am a method');


		// References
		/*
		Using Inheritance Patterns To Organize Large jQuery Applications (by Alex Sexton) - http://goo.gl/Z4lYz
		How to Manage Large Applications With jQuery or Whatever (by Alex Sexton) - http://goo.gl/kKWhj
		Practical Example of the Need for Prototypal Inheritance (by Neeraj Singh) - http://goo.gl/jrzb6
		Prototypal Inheritance in JavaScript (by Douglas Crockford) - http://goo.gl/TPXqV
		Essential jQuery Plugin Patterns (by Addy Osmani) - http://goo.gl/oE0ge
		*/
		</script>
	</body>
</html>